package com.xuecheng.api.content;

import com.xuecheng.api.content.model.dto.CourseBaseDTO;
import com.xuecheng.api.content.model.qo.QueryCourseBaseModel;
import com.xuecheng.api.content.model.vo.CourseBaseVO;
import com.xuecheng.common.domain.page.PageRequestParams;
import com.xuecheng.common.domain.page.PageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

/**
 * <p>
 * 课程信息 Api 接口
 * <p/>
 */
@Validated
@Api(value = "课程基本信息管理", tags = "课程信息基本管理 API")
public interface CourseBaseApi {

    /**
     * 分页条件查询课程基本信息
     *
     * @param params 分页参数
     * @param model  查询条件
     * @return {@link PageVO 分页对象封装}
     */
    @ApiOperation("分页条件查询课程基本信息")
    PageVO queryCourseBaseList(PageRequestParams params, QueryCourseBaseModel model);

    /**
     * 添加课程基本信息
     *
     * @param courseBaseVO 添加的课程基本信息VO封装
     * @return {@link CourseBaseDTO 课程基本信息DTO封装}
     */
    @ApiOperation("添加课程基本信息")
    CourseBaseDTO createCourseBase(@Valid CourseBaseVO courseBaseVO);

    /**
     * 根据课程ID查询课程基本信息
     *
     * @param courseBaseId 课程ID
     * @return {@link CourseBaseDTO 课程基本信息DTO封装}
     */
    @ApiOperation("根据课程ID查询课程基本信息")
    CourseBaseDTO queryCourseBaseById(@Valid @NotNull(message = "课程ID不可以为空") Long courseBaseId);

    /**
     * 修改课程基本信息
     *
     * @param vo 课程基本信息VO封装
     * @return {@link CourseBaseDTO 课程基本信息DTO封装}
     */
    @ApiOperation("修改课程基本信息")
    CourseBaseDTO modifyCourseBase(@Valid CourseBaseVO vo);

    /**
     * 删除课程信息
     *
     * @param courserBaseId 课程ID
     */
    @ApiOperation("删除课程信息")
    void removeCourseBaseById(@Valid @NotNull(message = "课程ID不可以为空") Long courserBaseId);

    /**
     * 提交课程到平台审核
     *
     * @param courseBaseId
     */
    @ApiOperation("提交审核")
    @ApiImplicitParam(name = "courseBaseId", value = "课程ID", required = true, dataType = "Long", paramType = "path", example = "1")
    void commitCourseBase(@Valid @NotNull(message = "课程ID不可以为空") Long courseBaseId);

    /**
     * 课程预览
     *
     * @param courseId  课程ID
     * @param companyId 机构ID，由于前端技术问题，请求此接口无法携带请求头，所以需要自己传递机构ID
     * @return
     */
    @ApiOperation("课程预览")
    Object previewCourse(Long courseId, Long companyId);

    /**
     * 课程发布
     *
     * @param courseId 课程ID
     */
    @ApiOperation("课程发布")
    void publish(Long courseId);

}
